<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>

                    <h4>迭代</h4>
                    <div class="x-wiki-info"><span>2256次阅读</span></div>
                    <hr style="border-top-color:#ccc" />
                    <div class="x-wiki-content x-content"><p>如果给定一个list或tuple，我们可以通过<code>for</code>循环来遍历这个list或tuple，这种遍历我们成为迭代（Iteration）。</p>
<p>在Python中，迭代是通过<code>for ... in</code>来完成的，而很多语言比如C或者Java，迭代list是通过下标完成的，比如Java代码：</p>
<pre><code>for (i=0; i&lt;list.length; i++) {
    n = list[i];
}
</code></pre><p>可以看出，Python的<code>for</code>循环抽象程度要高于Java的<code>for</code>循环，因为Python的<code>for</code>循环不仅可以用在list或tuple上，还可以作用在其他可迭代对象上。</p>
<p>list这种数据类型虽然有下标，但很多其他数据类型是没有下标的，但是，只要是可迭代对象，无论有无下标，都可以迭代，比如dict就可以迭代：</p>
<pre><code>&gt;&gt;&gt; d = {&#39;a&#39;: 1, &#39;b&#39;: 2, &#39;c&#39;: 3}
&gt;&gt;&gt; for key in d:
...     print key
...
a
c
b
</code></pre><p>因为dict的存储不是按照list的方式顺序排列，所以，迭代出的结果顺序很可能不一样。</p>
<p>默认情况下，dict迭代的是key。如果要迭代value，可以用<code>for value in d.itervalues()</code>，如果要同时迭代key和value，可以用<code>for k, v in d.iteritems()</code>。</p>
<p>由于字符串也是可迭代对象，因此，也可以作用于<code>for</code>循环：</p>
<pre><code>&gt;&gt;&gt; for ch in &#39;ABC&#39;:
...     print ch
...
A
B
C
</code></pre><p>所以，当我们使用<code>for</code>循环时，只要作用于一个可迭代对象，<code>for</code>循环就可以正常运行，而我们不太关心该对象究竟是list还是其他数据类型。</p>
<p>那么，如何判断一个对象是可迭代对象呢？方法是通过collections模块的Iterable类型判断：</p>
<pre><code>&gt;&gt;&gt; from collections import Iterable
&gt;&gt;&gt; isinstance(&#39;abc&#39;, Iterable) # str是否可迭代
True
&gt;&gt;&gt; isinstance([1,2,3], Iterable) # list是否可迭代
True
&gt;&gt;&gt; isinstance(123, Iterable) # 整数是否可迭代
False
</code></pre><p>最后一个小问题，如果要对list实现类似Java那样的下标循环怎么办？Python内置的<code>enumerate</code>函数可以把一个list变成索引-元素对，这样就可以在<code>for</code>循环中同时迭代索引和元素本身：</p>
<pre><code>&gt;&gt;&gt; for i, value in enumerate([&#39;A&#39;, &#39;B&#39;, &#39;C&#39;]):
...     print i, value
...
0 A
1 B
2 C
</code></pre><p>上面的<code>for</code>循环里，同时引用了两个变量，在Python里是很常见的，比如下面的代码：</p>
<pre><code>&gt;&gt;&gt; for x, y in [(1, 1), (2, 4), (3, 9)]:
...     print x, y
...
1 1
2 4
3 9
</code></pre><h3 id="-">小结</h3>
<p>任何可迭代对象都可以作用于<code>for</code>循环，包括我们自定义的数据类型，只要符合迭代条件，就可以使用<code>for</code>循环。</p>
</div>

                    <hr style="border-top-color:#ccc" />

                    